{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9f13b6f1-52db-4b55-8233-3457f9cb2c74",
   "metadata": {},
   "source": [
    "AES 的构造方法。本节将要从嵩层面介绍 Rijndael/AES 的结构。(从技术上讲, Rijndael 和 AES 不是相同的, 其区别对这里的讨论来说并不重要。) 关于 DES, 将不介绍完整的说 明，而且描述将作为实现的基础。目的只是提供一个算法如何工作的总体思想。\n",
    "\n",
    "AES 分组密码拥有 128 比特的分块长度, 而用可以使用 $128 、 192$ 或者 256 比特大小的密 钥。密钥的长度影响着密钥编排 (即在每一轮中使用的子密钥) 和轮的次数, 但是不影响每 一轮中的高级结构。\n",
    "\n",
    "与使用 Feistel 结松的 DES 相比, AES 本质上是一个代替置换网络。在 AES 的计算中, 有一个被称为状态的 4 乘 4 字节数组, 是通过多轮操作来修改的。这个状态的最初设置和分 组密码的输入是相等的 (注意输入是 128 比特, 确切的是 16 字节)。下面的操作会在每一轮 的 4 个阶段中操纵这个状态。\n",
    "\n",
    "(1)阶段1-一密钥加 (AddRoundKey):在 AES 的每一轮中，128 比特的子密都是从主密钥处推得的，并解释成4乘4的字节数组。状态数组与子密异或，实现更新。\n",
    "(2) 阶段2字节代替 (SubBytes): 在这一步中，状态数组中的每个字节都被另一个宁节代替，这个代替的字节是由一个固定的查询表S决定的。这个替换表(或S盒)是一个在 $\\{0,1\\}^8$ 上的双射。只有一个S盒，且它在每一轮中被用来代替状态数组的所有字节。\n",
    "(3)阶段 3-行移位(ShitRows):在这一步中，状态数组每一行的字节按如下方式循环左移:第一行不动，第二行左移-位，第三行左移两位，第四行左移三位。所有的移位都是循环的，例如第二行中第一个字节变成了第四个字节。\n",
    "11011001\n",
    "10110011\n",
    "(4)阶段4--列混合(MixColumns):在这一中，对每-列进行可逆的线性转换。可以视为矩阵乘法(在某些适合的域上的运算)。\n",
    "\n",
    "通过将第 3 个和第 4 个阶段一起视为 “混合” 阶段, 可看到 AES 的每一轮都有代替置换网 络的结构：某轮的子密钥首先和当前这一轮的输入进行异或; 接下来, 一个小的可逆函数被用 在 “分块”上; 最后, 结果的比特被混合起来以得到扩散。唯一的不㞴是, 不像对代替悳换网 络的总体描述, 这里的混合步骤不是由比特的简单置换组成的, 而是使用比特的可逆线性转换 来完成的。(将事情简化一点, 看一个简单们 3 比特的例子, $x=x_1\\left\\|x_2\\right\\| \\|_3$ 的比特置换, 可能将 $x$ 映射到 $r^{\\prime}=x_2\\left\\|x_1\\right\\| x_3$ 。一个可逆线性转换可将 $x$ 映射到 $x_1 \\oplus x_2\\left\\|x_2 \\oplus x_3\\right\\| x_1 \\oplus x_2 \\oplus x_3$ 。)\n",
    "\n",
    "AES 中的轮数取决于密钥的长度。 128 比特的密钥对应 10 轮, 192 比特的密钥対应 12 轮, 而 256 比特则对应 14 轮。在 AES 的最后轮忉, “列混合”步骤被额外的 “密钥加”步骤 取代 (这吅以阻止故手简单地逆转最后三个阶段, 这是不依赖于密钥的)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8c92a2b9-c828-42bb-9d14-df2ac8d740f8",
   "metadata": {},
   "outputs": [],
   "source": [
    "255 0 200\n",
    "0   100 11\n",
    "21  30  50\n",
    "110 220\n",
    "200 41\n",
    "1 255\n",
    "255 20"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0e1c9ea8-0761-44a9-b435-135d772a3686",
   "metadata": {},
   "outputs": [],
   "source": [
    "【|】"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
